<?php
namespace App\Services\Wechat;
/**
 * @author: Gardennet
 * @date: 16-12-15
 * @email: lwp8800@sina.com
 */

/**
 * 微信服务类
 * Class WechatServiceInterface
 * @package App\Services\Wechat
 */
interface WechatServiceInterface
{
    /**
     * 长链接转短链接接口
     * @param string $url 链接
     *                    false 失败
     *                    true  返回短连接
     *                    认证服务号独有权限
     * @return bool|string
     */
    public function getShortUrl(string $url): string;

    /**
     * 微信Oauth获取code
     * @param string $redirectUrl 回调地址
     * @param string $type        类型   snsapi_userinfo|snsapi_base
     * @return array
     */
    public function wechatGetCode(string $redirectUrl, string $type = 'snsapi_userinfo'): array;

    /**
     * 获取openid
     * @param string $redirectUrl 回调地址
     * @param string $type        类型   snsapi_userinfo|snsapi_base
     * @return array|bool
     */
    public function getOpenidByCode(string $redirectUrl, string $type = 'snsapi_userinfo');

    /**
     * 微信Oauth授权登录
     * @param string $redirectUrl 回调地址
     * @param string $to          成功后跳转地址
     * @return array|bool
     */
    public function wechatLogin(string $redirectUrl, string $to = '');

    /**
     * 微信Oauth授权登录
     * @param string $code 授权code
     * @param string $to   成功后跳转地址
     * @return array
     */
    public function wechatLoginByCode(string $code, string $to = ''): array;

    /**
     * 生成js 必需的config
     * 只需在视图文件输出JS代码:
     *  wx.config(<?= json_encode($wehcat->jsApiConfig()) ?>); // 默认全权限
     *  wx.config(<?= json_encode($wehcat->jsApiConfig([ // 只允许使用分享到朋友圈功能
     *      'jsApiList' => [
     *          'onMenuShareTimeline'
     *      ]
     *  ])) ?>);
     * @param array $config
     * @param bool  $debug
     * @param string  $appoint_url    指定的链接
     * @return array
     */
    public function jsApiConfig($config = [], $debug = false,$appoint_url = ''): array;

    /**
     * 发送客服消息
     *
     * @param string|array $openid 粉丝openid
     * @param array|string $msg    消息
     *
     * 消息格式
     * $msg=[
     *   'first'=>['value'=>'恭喜您充值成功！'],
     *   'money'=>['title' => '充值金额', 'value'=>$data['price'].'元'],
     *   'product'=>['title' => '充值方式', 'value'=>$data['pay_type']],
     *   'remark'=>['value'=>"充值时间:".date('Y-m-d H:i:s',$data['time'])."\n\n谢谢您对我们的支持！"],
     *   ];
     * @param string       $url    链接
     * @return array
     */
    public function sendCustomMessage($openid, $msg, string $url = ''): array;

    /**
     * 发送模板消息
     *
     * @param array|string $openid      粉丝openid
     * @param string       $template_id 模板id
     * @param array        $msg         消息
     *
     * 消息格式
     * $msg=[
     *   'first'=>['value'=>'恭喜您充值成功！'],
     *   'money'=>['title' => '充值金额', 'value'=>$data['price'].'元'],
     *   'product'=>['title' => '充值方式', 'value'=>$data['pay_type']],
     *   'remark'=>['value'=>"充值时间:".date('Y-m-d H:i:s',$data['time'])."\n\n谢谢您对我们的支持！"],
     *   ];
     * @param string       $url         链接
     * @return array
     */
    public function sendTplMessage($openid, string $template_id, array $msg, string $url = ''): array;

    /**
     * 获取微信开放平台预授权码
     * @return string
     */
    public function getComponentPreAuthCode(): string;

    /**
     * 获取授权方的公众号帐号基本信息
     * @return array|null
     */
    public function getAuthorizerInfo($authInfo);

    /**
     * 获取微信开放平台授权信息
     * @return array|null
     */
    public function getComponentAuthInfo($authCode);

    /**
     * 获取微信开放平台（刷新）授权公众号的接口调用凭据（令牌）
     * @return string|null
     */
    public function getAuthorizerToken($authInfo);

    /**
     * 开放平台
     * 自定义菜单创建接口(创建菜单)
     * @param array  $buttons         菜单结构字符串
     * @param string $authAccessToken 授权公众号的接口调用凭据
     * @return array
     */
    public function createOpenMenu($buttons, $authAccessToken): array;

    /**
     * 开放平台
     * 自定义菜单查询接口(获取菜单)
     * @param string $authAccessToken 授权公众号的接口调用凭据
     * @return array|bool
     */
    public function getOpenMenu($authAccessToken);

    /**
     * 开放平台
     * 自定义菜单删除接口(删除菜单)
     * @param string $authAccessToken 授权公众号的接口调用凭据
     * @return bool
     */
    public function deleteOpenMenu($authAccessToken): bool;

    /**
     * 开放平台访问入口
     * @return string|void
     */
    public function main();
}